package classDemo;

/**
 * Created by AJie on 2019/7/26
 * Function :类初始化加载顺序
 * 结果：
 *
 * ParentSingleton  block ！！！  //父类属性 todo 1、 这里最大的原因就是，类加载的时候，要给属性初始化，
 * ParentSingleton new instance   //而这里的初始化又刚好是 创建java 实例，需要执行构造，
 *                                //执行构造的前面又必须先执行 {} 大括号非 static 块。
 *
 * ParentSingleton static block   //todo 2、父类 static {}
 * ParentSingleton  block ！！！  //todo 3、子类  static 的 new instance
 * ParentSingleton new instance
 * Singleton5  block ！！！
 * Singleton5 new instance
 *
 * Singleton5 static block      //todo 4、 子类 static field
 */
public class ClassLoad5_Parent {
    public static void main(String[] args) {
        Singleton5 singleton5 = Singleton5.getSingleton5();
    }
}

class Singleton5 extends ParentSingleton {
    private static Singleton5 singleton5 = new Singleton5();

    private Singleton5() {
        System.out.println("Singleton5 new instance");
    }

    public static Singleton5 getSingleton5() {
        return singleton5;
    }

    static {
        System.out.println("Singleton5 static block");
    }

    {
        System.out.println("Singleton5  block ！！！ ");
    }

}

class ParentSingleton {

    private static ParentSingleton parentSingleton = new ParentSingleton();

    public ParentSingleton() {

        System.out.println("ParentSingleton new instance");
    }

    static {
        System.out.println("ParentSingleton static block");
    }

    {
        System.out.println("ParentSingleton  block ！！！ ");
    }

}
